home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-07-06 | 81.0 KB | 3,025 lines |
- ;
- ; EJERCICIOS DEL LENGUAJE C
- ;
-
- ; LECCION 1
- begin
- begine "test"
- pregunta
-
- ¿Qué tipo de fichero es aquél que tiene extensión OBJ?
- opciones
- Fichero fuente
- Fichero objeto
- Fichero ejecutable
- Fichero de librería
- respuesta
- 2
- ende
- begine "pcc"
- pregunta
-
- ¿Quién fue el inventor del lenguaje C?
- respuesta
- Dennis Ritchie
- ende
- begine "pcc"
- pregunta
- ¿Qué imprime la siguiente sentencia C?
- printf ("%d %d %d", 4 + 5, -2 - 3 + 1, 8 * 5);
- respuesta
- 9 -4 40
- ende
- begine "pcc"
- pregunta
- /* ¿Qué valor toma la variable z en este programa? */
- main () { int x, y, z; x = 7; y = 8; z = x + y - 5; }
- respuesta
- 10
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los pasos en el desarrollo de un programa?
- respuesta
-
- 1. Escribirlo. 2. Compilarlo. 3. Enlazarlo. 4. Ejecutarlo
- ende
- begint
- begine "test"
- pregunta
-
- ¿Con qué tecla ejecutamos un programa en Turbo C?
- opciones
- ALT-F5
- ALT-F9
- F9
- CTRL-F9
- respuesta
- 4
- ende
- endt
- begine "prpr"
-
- Escribe un programa que imprima tu nombre y apellidos.
- ende
- begine "prpr"
-
- Haz un programa que convierta tu edad de años a días.
- Por el momento, no tengas en cuenta las fracciones de
- años y los años bisiestos.
- ende
- end lección 1
-
- ; LECCION 2
- begin
- begine "psc"
- pregunta
-
- ¿Cuáles son los 5 tipos de datos básicos?
- respuesta
-
- char, int, float, double, void
- ende
- begine "test"
- pregunta
-
- ¿Cuál de los siguientes nombres de variable es incorrecto?
- opciones
- _1
- _A_
- abc
- 3d
- respuesta
- 4
- ende
- begine "PCC"
- pregunta
- ¿Qué imprime la siguiente sentencia printf?
- printf ("123\b\b\"hola mundo\"");
- respuesta
- 1"hola mundo"
- ende
- begine "psc"
- pregunta
- Las constantes (y variables) de tipo char son tratadas por el C numérica-
- mente, es decir, se manejan con su valor ASCII. Bajo este punto de vista,
- el tratamiento del tipo char e int es muy similar. ¿Es igual 'A' y 65?
- respuesta
-
- Sí, se pueden considerar igual, ya que el valor ASCII de 'A' es 65.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los 4 modificadores de tipo?
- respuesta
-
- signed, unsigned, long, short
- ende
- begine "psc"
- pregunta
- ¿Se podría hacer las siguientes instrucciones en C?
- const int x = 5;
- x = 8;
- respuesta
- Las variables declaradas con el modificador de acceso const, es decir, las
- constantes, una vez inicializadas (en este caso con el valor 5) no se les
- puede asignar otro valor (en este caso se ha intentado asignar el valor 8)
- ende
- begine "psc"
- pregunta
- ¿Porqué la siguiente cadena es incorrecta?
- "Cadena de caracteres mala\"
- respuesta
- Al ser \" el caracter comilla, la cadena anterior no tiene comillas de
- cierre.
- ende
- begine "psc"
- pregunta
- ¿Cuál es el error cometido en las siguientes instrucciones C?
- int x[5];
- x[5] = 10;
- respuesta
- En este caso, el compilador no informa de ningún error, ni en compilación
- ni en ejecución; pero el resultado puede ser catastrófico ya que estamos
- poniendo el valor 10 en una posición de memoria no reservada (Mayor índ:4)
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- 2 + (1 < 2 ? 3 : 4) - 3
- opciones
- Valor 1
- Valor 2
- Valor 3
- Valor 4
- Valor 5
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- 2 > 3 ? 4 < 4 ? 2 : 3 : 1
- opciones
- Valor 1
- Valor 2
- Valor 3
- Valor 4
- Valor 5
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- 2 < 3 ? 4 < 4 ? 2 : 3 : 1
- opciones
- Valor 1
- Valor 2
- Valor 3
- Valor 4
- Valor 5
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- 2 > 3 ? 4 : 2 ? 3 : 1
- opciones
- Valor 1
- Valor 2
- Valor 3
- Valor 4
- Valor 5
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- (2 > 3) ? (4) : (-1 ? 3 : 1)
- opciones
- Valor 1
- Valor 2
- Valor 3
- Valor 4
- Valor 5
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- (4 >> 2) & (4 << 1)
- opciones
- Valor 0
- Valor 1
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de la siguiente expresión C?
-
- (4 >> 2) && (4 << 1)
- opciones
- Valor 0
- Valor 1
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿En todas las implementaciones de C son correctas estas afirmaciones?
- sizeof (char) ≤ sizeof (short) ≤ sizeof (int) ≤ sizeof (long)
- sizeof (float) ≤ sizeof (double)
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "prpr"
-
- Dada la función
- y = 1/4 x
- diseñar un programa que para el valor de abcisa 4.4 dé
- el correspondiente a la ordenada.
-
- Nota: La expresión anterior en C se escribe:
- y = (1.0 / 4) * x;
- o
- y = (1 / 4.0) * x;
- ya que si se hace
- 1 / 4
- el resultado es 0 en vez de 0.25.
-
- Otras dos soluciones son:
- y = ((float) 1 / 4) * x;
- o
- y = (1 / (float) 4) * x;
- ende
- begine "prpr"
-
- La Tierra no es una esfera; está ligeramente aplanada y por lo tanto
- es más bien un esferoide aplanado. La fórmula para su volumen es:
-
- v = 4/3 π a a b
-
- Calcúlese el volumen de la Tierra para los siguientes datos:
-
- a = 12454,5 Km;
- b = 12711.1 Km.
- ende
- begine "prpr"
-
- La relación entre temperaturas Celsius y Farenhait está dada por:
-
- C = 5/9 (F-32)
-
- Diseñar un programa que convierta 20 grados F en C.
- ende
- end lección 2
-
- ; LECCION 3
- begin
- begine "test"
- pregunta
-
- ¿Las sentencias if y switch son condicionales o iterativas?
- opciones
- condicionales
- interativas
- respuesta
- 1
- ende
- begine "test"
- pregunta
- Las sentencias while, for y do son sentencias iterativas.
- ¿Es cierta esta afirmación?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿En qué caso(s) se asigna el valor 4 a la variable b?
- if (a = 3)
- b = 4;
- respuesta
- Siempre, puesto que se asigna el valor 3 a la variable a y la condición
- toma el valor 3 que es cierta. Otra cosa distinta sería: 'if (a == 3)'
- en cuyo caso sólo se asignaría el 4 a b en el caso de que a valga 3.
- ende
- begine "test"
- pregunta
- /* ¿Qué valor imprime este programa? */
- void main (void)
- { int x = 10; if (0 && (x = 20)) x = 30; printf ("%d", x); }
- opciones
- 10
- 20
- 30
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- /* sentencia 1: */ if (condicion) sentencia_1 else sentencia_2
- /* sentencia 2: */ condicion ? sentencia_1 : sentencia_2
- ¿Son siempre equivalentes estas dos sentencias?
- respuesta
- No. En el operador ?, ni sentencia_1 ni sentencia_2 pueden ser
- sentencias compuestas, mientras que en el if sí lo pueden ser.
- ende
- begine "test"
- pregunta
-
- ¿Toda sentencia switch se puede expresar con la escala if-else-if?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿Qué ocurre si no hay ninguna sentencia default en una sentencia switch?
- respuesta
- Que si fallan todas las comprobaciones de los case, no se ejecuta
- ninguna acción en el switch. Es más, incluso el default puede ir
- en cualquier sitio funcionando exactamente igual.
- ende
- begine "pcc"
- pregunta
- ¿Cuántas veces se ejecuta sentencia en el while siguiente?
- i = 0;
- while (i <= 10) sentencia
- respuesta
- 11
- ende
- begine "pcc"
- pregunta
- ¿Cuántas veces se ejecuta sentencia en el while siguiente?
- i = 1;
- while (i <= 10) sentencia
- respuesta
- 10
- ende
- begine "pcc"
- pregunta
- ¿Cuántas veces se ejecuta sentencia en el while siguiente?
- i = 0;
- while (i < 10) sentencia
- respuesta
- 10
- ende
- begine "test"
- pregunta
-
- ¿Toda sentencia for se puede expresar como una sentencia while?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "pcc"
- pregunta
- ¿Cuántas veces se ejecuta sentencia en el for siguiente?
- for (i = 0; i <= 10; i++)
- sentencia
- respuesta
- 11
- ende
- begine "pcc"
- pregunta
- ¿Qué valor tiene la variable i al salir del for siguiente?
- for (i = 1; i <= 10; i++)
- sentencia
- respuesta
- 11
- ende
- begine "psc"
- pregunta
- ¿Cómo nos podemos salir del bucle for siguiente?
- for (;;)
- sentencia
- respuesta
- La única forma de salirnos del bucle de tal forma que el control se
- vaya a la sentencia siguiente es mediante la sentencia de control
- break.
- ende
- begine "psc"
- pregunta
-
- ¿Qué hace la sentencia break?
- respuesta
- La sentencia break provoca la salida inmediata de las sentencias
- switch, while, for y do.
- ende
- begine "psc"
- pregunta
-
- ¿Qué hace la sentencia continue?
- respuesta
- La sentencia continue fuerza una nueva iteración previa comprobación
- de la condición del bucle en las sentencias while, for y do.
- ende
- begine "psc"
- pregunta
-
- ¿Es bueno utilizar la sentencia goto en un programa?
- respuesta
- No, puesto que la utilización de la sentencia goto disminuye la
- legibilidad de un programa.
- ende
- begine "prpr"
-
- Diseña un programa que escriba el siguiente gráfico en pantalla,
- utilizando únicamente dos tipos de sentencias: la sentencia
- iterativa for y la sentencia de escritura: printf ("*").
-
- *
- **
- ***
- ****
- *****
- ******
- *******
- ********
- *********
- **********
- *********
- ********
- *******
- ******
- *****
- ****
- ***
- **
- *
-
- ende
- begine "prpr"
-
- Hacer un programa que calcule e imprima el factorial de 5.
- ende
- begine "prpr"
-
- Hacer un programa que genere la lista de los 100 primeros números pares.
- Hacedlo de tres formas distintas: con bucle for, while y do.
- ende
- begine "prpr"
-
- Haz un programa que escriba todos los números menores que 50 y no
- divisibles por 3.
- ende
- end lección 3
-
- ; LECCION 4
- begin
- begine "psc"
- pregunta
- De las funciones exit (), _exit () y abort ().
- ¿Cuál es preferible utilizar para terminar un programa inmediatamente?
- respuesta
- La función exit () ya que no es bueno terminar un programa dejando los
- ficheros abiertos sin cerrar. La función _exit () se utiliza internamente,
- de hecho, las funciones exit () y abort () la llaman internamente.
- ende
- begint
- begine "psc"
- pregunta
- ¿Para qué se utiliza las constantes EXIT_SUCCESS y EXIT_FAILURE
- en Turbo C?
- respuesta
-
- Para pasarlas como parámetro a las función exit ().
- ende
- endt
- begine "psc"
- pregunta
-
- ¿Qué utilidad tiene la función assert ()?
- respuesta
- Esta función se suele utilizar en el desarrollo del programa para
- verificar que el programa funciona correctamente.
- ende
- begine "psc"
- pregunta
- ¿A menos que se cambie, qué periférico suele ser la entrada estándar
- y cuál la salida estándar?
- respuesta
- La entrada estándar suele ser el teclado y la salida estándar suele
- ser el monitor.
- ende
- begine "psc"
- pregunta
-
- ¿Qué valor tiene la constante EOF y para qué se utiliza?
- respuesta
- Tiene el valor de -1 y se utiliza como carácter fin de fichero.
- Cuando trabajamos con caracteres entre los que puede estar EOF,
- debemos declarar las variables de tipo int y no de tipo char.
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia existe entre la cadena de control (utilizadas en las
- funciones con formato) y la cadena de caracteres del lenguaje C?
- respuesta
- La principal diferencia es que la cadena de control contiene en su
- interior códigos de formato (empiezan con %) que junto con los otros
- argumentos convierten esta cadena en una cadena de caracteres.
- ende
- begine "psc"
- pregunta
-
- ¿Qué diferencia hay entre el código de formato %d y %i?
- respuesta
-
- Ninguna. Pero por convención siempre se utiliza %d.
- ende
- begine "psc"
- pregunta
-
- ¿Cuál es la diferencia entre los códigos de formato %f, %e y %g?
- respuesta
- Que %f siempre formatea número con notación no científica, %e lo
- formatea con notación científica y %g formatea con %e o %f, el que
- produzca un número con menor longitud. El que más se utiliza es %g.
- ende
- begine "psc"
- pregunta
-
- ¿Qué diferencia existe entre los códigos de formato %e y %E?
- respuesta
- Que %e formatea la letra del exponente en minúscula (e) y %E en
- mayúscula (E). Lo mismo se puede decir para los códigos de for-
- mato %x y %X, y %g y %G.
- ende
- begine "psc"
- pregunta
-
- ¿Las funciones printf () y scanf () devuelven algún valor?
- respuesta
- Sí; printf () devuelve el número de caracteres escritos en caso de éxito
- o EOF en caso de error; scanf () devuelve el número de campos asignados
- si ha habido éxito o EOF si ocurre un error o se detecta fin de fichero.
- ende
- begine "psc"
- pregunta
- ¿Hacen lo mismo las dos sentencias siguientes?
- ch = getchar ();
- scanf ("%c", &ch);
- respuesta
- Sí, pero para leer un solo carácter es preferible utilizar la función
- getchar () ya que genera menos código que la función scanf (). Lo mismo
- se puede decir de las sentencias putchar (ch) y printf ("%c", ch).
- ende
- begine "psc"
- pregunta
- Cuando se quiere escribir en pantalla y leer de teclado.
- ¿Es preferible utilizar las funciones de entrada/salida
- o las funciones de consola?
- respuesta
- Las funciones de consola porque no se pueden redireccionar
- y son más rápidas y más elegantes trabajando con consola
- que las funciones de entrada/salida.
- ende
- begint
- begine "psc"
- pregunta
- En la librería <conio.h> de Turbo C existe una variable global
- llamada directvideo. ¿Qué valores puede tomar esta variable y
- qué significado tiene cada valor?
- respuesta
- Puede tomar dos valores: 0 y 1. El valor 1 hace que la salida
- vaya directamente a RAM de vídeo y el valor 0 hace que la salida
- se haga vía llamadas a la ROM BIOS. El valor por defecto es 1.
- ende
- endt
- begine "psc"
- pregunta
-
- ¿Qué diferencia hay entre las funciones getch () y getche ()?
- respuesta
- En la función getch () los caracteres leídos del teclado no se
- escriben en pantalla y en la función getche () sí se escriben.
- ende
- begine "psc"
- pregunta
-
- ¿Qué hace la función ungetch ()?
- respuesta
-
- Devuelve un carácter al teclado.
- ende
- begine "psc"
- pregunta
- ¿Cuando termina el siguiente bucle?
- while (! kbhit ())
- sentencia
- respuesta
-
- Cuando se pulsa una tecla.
- ende
- begine "prpr"
-
- LECTURA Y RESOLUCION DE UN SISTEMA DE ECUACIONES CON DOS ECUACIONES
- Y DOS INCOGNITAS
-
- Un sistema de ecuaciones lineales de la forma
-
- ax + by = c
- dx + ey = f
-
- puede resolverse utilizando las siguientes fórmulas:
-
- x = (ce - bf) / (ae - bd)
- y = (ae - cd) / (ae - bd)
-
- Diséñese un algoritmo para leer los dos conjuntos de coeficientes
- (a, b y c; d, e y f) e imprimir los valores que son solución para
- x e y. Imprímase un mensaje si el sistema no se pudiese resolver
- por estas fórmulas.
- ende
- begine "prpr"
-
- RESOLUCION DE UNA DETERMINADA FUNCION MATEMATICA
-
- Diseñar un programa que lee un valor x y calcule el valor de
- y=x*x+5 para el caso en que x sea menor que 0 e y=3*x-1 para
- valores de x entre 0 y 2 e y=x*x-4*x+5 para x mayor que 2.
- ende
- begine "prpr"
-
- CALCULO DE LA SUMA DE UNA DETERMINADA SERIE
-
- Escribir un programa que pregunte un dato N y que calcule la
- suma S de 1*1 + 2*2 + 3*3 + ... hasta que dicha suma sea mayor
- o igual que N. Entonces escribirá N, S y el último número que
- ha elevado al cuadrado.
- ende
- begine "prpr"
-
- CALCULO DEL PRODUCTO DE DOS NUMEROS MEDIANTE SUMAS SUCESIVAS
-
- Programa que obtenga el producto de dos números enteros positivos
- mediante sumas sucesivas.
- ende
- begine "prpr"
-
- TABLA DE MULTIPLICAR DE UN NUMERO
-
- Programa que imprima la tabla de multiplicar de un número entero
- positivo.
- ende
- begine "prpr"
-
- CONTADOR DE VOCALES DE UNA FRASE
-
- Programa que lea una frase en una línea, y cuente su número de vocales.
- ende
- begine "prpr"
- CALCULO DEL PRODUCTO DE DOS NUMEROS MEDIANTE EL ALGORITMO RUSO
-
- Programa que calcule el producto de dos números enteros positivos
- mediante el denominado "algoritmo ruso del producto".
-
- Al algoritmo consiste en duplicar el primer factor y dividir (cociente
- entero) por 2 el segundo, obteniendo un producto equivalente, salvo si
- el segundo factor es impar, en cuyo caso es necesario acumular previa-
- mente el primero en donde se va a obtener el resultado. El proceso
- termina cuando el segundo factor se hace 0.
-
- Ejemplo: Multiplicación de 25*6.
-
- Primer factor Segundo factor Acumulador
- ------------- -------------- ----------
- 25 6 0
- 50 3 50
- 100 1 150
- 200 0 150
- ende
- begine "prpr"
-
- CALCULO DEL MAYOR Y MENOR SUELDO DE UNA PERSONA
-
- Programa que lea 20 datos, compuesto cada uno de ellos por un nombre
- de persona y su sueldo neto mensual, y obtenga e imprima el nombre y
- sueldo de la persona que más cobra y de la que menos. Si hay varias se
- imprime la primera que aparezca en la secuencia de entrada.
- ende
- end lección 4
-
- ; LECCION 5
- begin
- begine "psc"
- pregunta
- ¿Cuándo puede ser útil una función como la siguiente?
- void funcion (void) { }
- respuesta
- Es útil durante el desarrollo de un programa mientras no se
- implementa dicha función.
- ende
- begine "test"
- pregunta
- ¿Cuál de las opciones del menú no es un prototipo de esta función?
- void func (float f1, float f2) { printf ("%f", f1 >= f2 ? f1 : f2); }
- opciones
- void func (float f1, float f2);
- void func (float f1, float);
- void func (f1, float f2);
- void func (float, float);
- func (float, float);
- respuesta
- 5
- ende
- begine "psc"
- pregunta
- ¿Qué dos acciones realiza esta sentencia return?
- return 10;
- respuesta
- La primera es forzar una salida inmediata de la función en que se
- encuentra. La segunda es devolver el valor 10.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los tres tipos de variables según el lugar de declaración?
- respuesta
- Los tres tipos de variables según el lugar de declaración son:
- variables locales, parámetros formales y variables globales.
- ende
- begine "psc"
- pregunta
- /* ¿Qué imprime este programa? */
- #include <stdio.h>
- void main (void) { int x = 1; { int x; printf ("%d", x); } }
- respuesta
- El valor que se imprime es impredecible puesto que a la segunda
- variable local declarada no se le ha asignado ningún valor.
- ende
- begine "pcc"
- pregunta
- ¿Cuántos argumentos se le pasan a esta función?
- func (2, (3, 4), 5);
- respuesta
- 3
- ende
- begine "test"
- pregunta
-
- ¿Cómo se denominan a las variables que se declaran fuera de las funciones?
- opciones
- Variables locales
- Parámetros formales
- Variables globales
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿Cuáles son los cuatro especificadores de clase de almacenamientos
- soportados por C?
- respuesta
- Los cuatro especificadores de clase de almacenamiento son:
- extern, static, register y auto.
- ende
- begine "test"
- pregunta
- En la siguiente declaración de la variable x,
- ¿se reserva memoria para ella?
- extern int x;
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "psc"
- pregunta
-
- ¿Cuál es el principal uso del especificador extern?
- respuesta
- El principal uso del especificador extern se da cuando un programa
- está compuesto por varios ficheros y una variable ha de ser global
- a las funciones de más de un fichero.
- ende
- begine "psc"
- pregunta
- El especificador static aplicado en la declaración de una variable
- hace que esta variable exista a lo largo de todo el programa. Pero,
- ¿Cuáles son los dos usos que tiene este especificador?
- respuesta
- 1º) Como variable estática local: hace que una variable local no pierda
- su valor al terminar la función. 2º) Como variable estática global: hace
- que sea imposible acceder a esta variable desde otro fichero.
- ende
- begine "test"
- pregunta
- ¿Se puede asegurar que el contenido de la variable x se va a guardar
- en un registro de la CPU?
- register char x;
- opciones
- SI
- NO
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿De qué tipo son las variables x e y?
- { int x;
- auto int y; }
- respuesta
- Según su tipo son enteras. Según el lugar de la declaración son de tipo
- local (fijaos en las llaves). Según el especificador de clase de almace-
- namiento son de tipo automáticas (el especificador auto es redundante).
- ende
- begine "psc"
- pregunta
-
- ¿Qué debemos hacer si queremos utilizar una función en varios ficheros?
- respuesta
- Debemos especificar su prototipo al principio de cada fichero en los
- que vamos a utilizar dicha función.
- ende
- begine "test"
- pregunta
- ¿Qué llamada a la función f de las opciones del menú es correcta
- teniendo en cuenta las siguientes declaraciones?
- int x, y, z; void f (int px, int *py, int *pz);
- opciones
- f (x, y, z);
- f (&x, &y, &z);
- f (x, &y, &z);
- f (&x, y, z);
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Qué devuelve la función func cuyo prototipo es el que se indica?
- int *func (void);
- opciones
- Un valor de tipo entero.
- Un puntero a entero.
- respuesta
- 2
- ende
- begine "pcc"
- pregunta
-
- ¿Cuántas formas hay de pasar un array como parámetro?
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿Qué hay que hacer en un programa C para que se le puede pasar
- información desde la línea de órdenes del sistema operativo?
- respuesta
- Declarar la función main de la siguiente forma:
- void main (int argc, char *argv[]);
- ende
- begine "test"
- pregunta
- Si la lógica de una función es similar en forma iterativa y en
- forma recursiva, ¿cuál de las dos formas es preferible utilizar?
- opciones
- La forma iterativa.
- La forma recursiva.
- respuesta
- 1
- ende
- begint
- begine "psc"
- pregunta
-
- ¿Cómo se puede realizar la compilación separada en Turbo C?
- respuesta
-
- Creando un fichero de proyecto.
- ende
- endt
- begine "test"
- pregunta
- ¿En qué librería nos encontramos la información necesaria para
- declarar una función con un número variable de argumentos?
- opciones
- <stdio.h>
- <stdlib.h>
- <stdarg.h>
- <conio.h>
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia hay entre estas dos directivas?
- #include <stdlib.h>
- #include "stdlib.h"
- respuesta
- Que la primera forma (#include <stdlib.h>) busca el fichero stdlib.h en
- los directorios del sistema y la segunda forma (#include "stdlib.h") lo
- busca en el directorio de trabajo.
- ende
- begine "PCC"
- pregunta
- #define X "macro"
- x = printf ("%s %s", "X", X);
- ¿Cómo expande el preprocesador la asignación de x anterior?
- respuesta
- x = printf ("%s %s", "X", "macro");
- ende
- begine "PCC"
- pregunta
- #define X(a,b) ((a)+a*b)
- x = X (5+8, 6);
- ¿Cómo expande el preprocesador la asignación de x anterior?
- respuesta
- x = ((5+8)+5+8*6);
- ende
- begine "test"
- pregunta
- #define X 10
- #undef X
- x = X; /* ¿Daría aquí error el compilador de C? */
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Por qué está mal, conceptualmente, esta constante simbólica?
- #define PI = 3.141593
- respuesta
- Lo correcto es:
- #define PI 3.141593
- La sentencia 'x=PI;' se expande en el primer caso a 'x== PI;'.
- ende
- begine "psc"
- pregunta
- ¿Por qué está mal, conceptualmente, esta macro?
- #define MAX(a,b) a>b?a:b
- respuesta
- Lo correcto es:
- #define MAX(a,b) ((a)>(b)?(a):(b))
- Pensad qué pasaría en el primer caso con 'MAX(x&&y,z)'.
- ende
- begine "PCC"
- pregunta
- #define fac(a) (a)*fac((a)-1)
- x = fac(3);
- ¿Cómo expande el preprocesador la asignación de x anterior?
- respuesta
- x = (3)*fac((3)-1);
- ende
- begine "psc"
- pregunta
-
- ¿Qué hace la directiva #error?
- respuesta
-
- Hace que el compilador finalice la compilación.
- ende
- begine "psc"
- pregunta
- Define una macro-función a la que se le pasa un número como argumento
- y devuelve su valor absoluto.
- respuesta
-
- #define ABS(X) ((X) >= 0 ? (X) : -(X))
- ende
- begine "psc"
- pregunta
- Define una macro-función a la que se le pase un número como argumento
- y devuelva su cuadrado.
- respuesta
-
- #define CUADRADO(X) ((X)*(X))
- ende
- begine "psc"
- pregunta
- ¿Por qué a las directivas #if-#else-#endif, #if-#elif-#endif,
- #ifdef-#endif y #ifndef-#endif se les llama directivas de
- compilación condicional?
- respuesta
- Porque compilan selectivamente parte del código fuente, es decir,
- que con ellas se puede compilar parte del código y dejar otras
- partes del código sin compilar.
- ende
- begint
- begine "test"
- pregunta
- ¿Es cierto que el operador defined sólo se puede utilizar en las
- expresiones correspondientes a las directivas #if y #elif?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- endt
- begine "psc"
- pregunta
- La directiva #line hace que el compilador crea que está compilando
- una determinada línea del código fuente y de un determinado fichero.
- ¿Cómo hace el preprocesador que el compilador crea tal cosa?
- respuesta
-
- Cambiando los valores de las constantes predefinidas __LINE__ y __FILE__.
- ende
- begine "psc"
- pregunta
-
- ¿Qué hace la directiva #pragma?
- respuesta
- Le da ciertas instrucciones al compilador. Estas instrucciones y la
- forma de dárselas dependen de la implementación del C con la que se
- trabaje.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son las cinco constantes predefinidas?
- respuesta
- Las constantes predefinidas son:
- __DATE__, __FILE__, __LINE__, __STDC__ y __TIME__
- ende
- begine "prpr"
-
- PROBABILIDADES BINOMIALES
-
- La función factorial sirve, entre otras cosas, para calcular las
- probabilidades binomiales, como ilustra este ejemplo:
-
- Un empleado coge todos los días un determinado tren para ir a
- trabajar, pero sabe que existe cierta probabilidad de que ese tren
- sea anulado. Teniendo en cuenta esa probabilidad, ¿cuáles son las
- de que en una semana sean cancelados 0, 1, 2 y hasta 5 trenes?
-
- Suponiendo que la cancelación del tren en un día cualquiera es
- independiente de lo que haya ocurrido en días anteriores, la fórmula
- que determina las probabilidades pedidas es:
-
- n! r n - r
- c = --------------- * p * (1 - p)
- (n - r!) * r!
- r
- (Nota: n! => factorial de n; p => p elevado a r).
-
- Donde p es la probabilidad de que se cancele un tren, r el número
- de cancelaciones en una semana (0, 1, 2, ..., 5), n es el número de
- jornadas laborales de la semana (5 en este caso) y c es la probabilidad
- de que se produzcan r cancelaciones.
-
- Escriba un programa que acepte la introducción de la probabilidad p,
- verifique si está en el intervalo 0-1 y calcule el valor de c para los
- valores de r comprendidos entre 0 y 5 (es decir, las probabilidades de
- que se cancelen 0, 1, 2, ... hasta 5 trenes).
-
- (Nota: realizar tres funciones además de la función main: c(),
- factorial() y potencia()).
-
- ende
- begine "prpr"
-
- CALCULO DEL NUMERO DE FIBONACCI
-
- El número de Fibonacci viene dado por la siguiente función:
-
- ┌
- │ 0
- FIB(n) = ┤ 1
- │ FIB(n-1) + FIB(n-2)
- └
-
- Realizar una función que calcule el número de Fibonacci. Hacerlo en
- dos versiones: una iterativa y otra recursiva.
- ende
- begine "prpr"
-
- CALCULO DEL MAXIMO COMUN DIVISOR
-
- Un algoritmo muy conocido que halla el máximo común divisor de dos
- enteros es el algoritmo de Euclides. La función del máximo común
- divisor se define de la siguiente forma
-
- ┌
- │ GCD(N,M), si N>M
- GCD(M,N) = ┤ M, si N=0
- │ GCD(N,M MOD N), si N>0
- └
-
- donde M MOD N es M módulo N (el resto de dividir M por N). Constrúyase
- una función recursiva para este problema y obtener el GCD(20,6).
- ende
- begine "prpr"
-
- CALCULO DE LA RAIZ CUADRADA DE UN NUMERO
-
- Escribir una función recursiva que calcule la raíz cuadrada de un
- número. Leer las triplas de números N, A y E, donde N es el número
- del cual tiene que hallarse su raíz cuadrada, A es un valor aproxi-
- mado de la raíz cuadrada y E es el error de tolerancia del resulta-
- do. Utilícese esta función, definida por
-
- ┌
- │ A,
- ROOT(N,A,E) = ┤ si │A*A-N│<E
- │ ROOT(N,((A*A)+N)/(2*A),E), en caso contrario
- └
- ende
- begine "prpr"
-
- CALCULO DE LA FUNCION DE ACKERMAN
-
- Una importante función teórica, que se conoce por función de Ackerman,
- viene definida por
-
- ┌
- │ N+1, si M=0
- A(M,N) = ┤ A(M-1,1), si N=0
- │ A(M-1,A(M,N-1)), en caso contrario
- └
-
- Obtener una función recursiva y otra iterativa del problema.
- ende
- begine "prpr"
-
- CALCULO DEL NUMERO DE PARTICIONES DISTINTAS DE UN NUMERO ENTERO
-
- Ciertas aplicaciones necesitan conocer el número de particiones
- distintas de un número entero dado N; es decir, de cuantas formas
- distintas se puede expresar N como suma de sumandos enteros. Por
- ejemplo, N=5 admite las particiones
-
- 1+1+1+1+1, 5, 1+2+2, 3+1+1, 2+3, 1+4, y 1+1+1+2
-
- Si denotamos por Q(M,N) el número de formas en que el entero M
- se puede expresar como una suma, de sumandos no superiores a N,
- entonces el número de particiones de N viene dado por Q(M,N). La
- función Q(M,N) viene definida recursivamente por
- ┌
- │ 1, si M=1 y para todo N
- │ 1, si N=1 y para todo M
- Q(M,N) = ┤ Q(M,M), si M<N
- │ 1+Q(M,M-1), si M=N
- │ Q(M,N-1)+Q(M-N,N), si M>N
- └
- Formular una función recursiva de este problema.
- ende
- begine "prpr"
-
- SUPRESION DE ELEMENTOS DUPLICADOS EN UN VECTOR
-
- Diséñese una función que acepte como parámetro un vector que
- contenga elementos duplicados. La función tiene que sustituir
- cada valor repetido por -1. La función devuelve el número de
- elementos modificados.
- ende
- end lección 5
-
- ; LECCION 6
- begin
- begine "pcc"
- pregunta
- ¿Cuál es el índice más alto con el que podemos acceder a este array?
- double a [100];
- respuesta
- 99
- ende
- begine "psc"
- pregunta
- ¿Qué pasa al ejecutar las siguientes sentencias?
- int v [10];
- v [20] = 30;
- respuesta
- Que el valor 30 se escribe en una posición de memoria no reservada.
- Esto quiere decir que el valor 30 se puede escribir sobre el código
- del sistema operativo, sobre el código de un programa residente, ...
- ende
- begine "pcc"
- pregunta
- ¿Cuántas formas hay de pasar un array unidimensional como argumento
- a una función?
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿Cuántos elementos de tipo char reservaremos para un array que va a
- contener una cadena de caracteres con un máximo de 10 caracteres?
- respuesta
- Reservaremos 11 caracteres, ya que el último elemento del array está
- reservado para el carácter nulo '\0'.
- ende
- begine "psc"
- pregunta
-
- ¿Son iguales los caracteres '0' y '\0'?
- respuesta
- No son iguales. El carácter '0' tiene código ASCII 48 y el carácter
- '\0' tiene código ASCII 0.
- ende
- begine "pcc"
- pregunta
-
- ¿Cuántos caracteres ocupa la constante de cadena "hola" en memoria?
- respuesta
- 5
- ende
- begine "test"
- pregunta
- ¿Se puede considerar que un array bidimensional es un array
- unidimensional donde cada elemento es un array unidimensional?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Qué error hay en estas sentencias C?
- float f[5][4];
- f[4,3] = 1.2;
- respuesta
- Que la segunda sentencia no es una sentencia C.
- Sería correcto: f[4][3] = 1.2.
- ende
- begine "test"
- pregunta
- Si m es una matriz, ¿es cierta esta comparación?
- m == &m[0][0]
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿A qué se llama array de cadenas?
- respuesta
- Se llama array de cadenas a un array unidimensional donde cada
- elemento en una cadena de caracteres.
- ende
- begine "psc"
- pregunta
- ¿Qué error hay en las siguientes sentencias?
- int n = 4;
- char am[n][5][6];
- respuesta
- El error está en el tamaño de la primera dimensión del array am.
- La especificación de los tamaños de las dimensiones de los arrays
- en las declaraciones deben ser expresiones constantes.
- ende
- begine "psc"
- pregunta
- ¿Hay algún error en la siguiente sentencia?
- void f (int m[][]) { /* ... */ }
- respuesta
- Sí, ya que falta la especificación de la segunda dimensión del
- array m en el parámetro de la función f.
- ende
- begine "psc"
- pregunta
- ¿Qué error hay en las siguientes sentencias?
- int v1[3] = { 1, 2, 3 }
- int v2 = 10;
- respuesta
-
- El error está en que falta un ; después de }.
- ende
- begine "test"
- pregunta
- ¿Son equivalentes las dos inicializaciones de cadena?
- char cadena [] = "123";
- char cadena [] = { '1', '2', '3' };
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Hay algún error en esta inicialización?
- double d [10] = { 1.1, 2e2, 3 };
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Es correcta esta inicialización?
- int matriz [] [] = { { 2, 3 }, { 4, 5 } };
- respuesta
-
- No es correcta, ya que no se ha especificado la segunda dimensión
- de matriz.
- ende
- begine "prpr"
-
- Programa que lea 20 números enteros sobre un vector y que calcule e
- imprima las sumas de las componentes de índice par y las de índice
- impar.
- ende
- begine "prpr"
-
- Programa que carga una matriz de 5 filas y 10 columnas con números
- enteros, imprimiendo los valores máximo y mínimo, y sus posiciones
- dentro de la matriz.
- ende
- begine "prpr"
-
- Programa que genera e imprime una matriz unitaria de orden N. Una
- matriz unitaria de orden N es la que tiene N filas y N columnas con
- todas sus componenetes a 0 excepto las de su diagonal principal,
- que están a 1.
- ende
- begine "prpr"
-
- Programa que imprime un CUADRADO LATINO de orden N. Un cuadrado
- latino de orden N es una matriz cuadrada en la que su primera
- fila contiene los N primeros números naturales y cada una de las
- siguientes N-1 filas contiene la rotación de la fila anterior un
- lugar a la derecha.
-
- Ejemplo:
-
- Cuadrado latino de orden 4.
-
- 1 2 3 4
- 4 1 2 3
- 3 4 1 2
- 2 3 4 1
- ende
- begine "prpr"
-
- Programa que carga un vector numérico de N componentes y obtiene e
- imprime los M valores menores y los M valores mayores. N y M son
- introducidos por el usuario; M ha de ser menor que N.
- ende
- begine "prpr"
-
- Programa que realiza la clasificación completa de una matriz numérica
- en orden creciente (de izquierda a derecha y de arriba a abajo).
- ende
- begine "prpr"
-
- Programa que lee una frase y averigua si es palíndroma. Una frase es
- palíndroma si se lee igual de izquierda a derecha que de derecha a
- izquierda.
-
- Ejemplos: «LE SACO SUS OCAS EL», «ANILINA».
-
- Considerar también el caso de las frases que se leen igual pero que
- no se escriben igual (debido a los espacios en blanco).
-
- Ejemplo: «DABALE ARROZ A LA ZORRA EL ABAD».
- ende
- begine "prpr"
-
- Diseñar un programa que lea dos matrices n*n y presente un menú de
- opciones para sumarlas, restarlas o multiplicarlas.
- ende
- begine "prpr"
-
- Diseñar un programa que lea una matriz n*n y calcule e imprima su
- traspuesta.
- ende
- begine "prpr"
-
- Diseñar un programa que genere 100 números aleatorios distintos.
-
- Nota: para saber los números que ya han sido generados, almacenar
- éstos en un array.
- ende
- begine "prpr"
-
- Realizar un programa que lea una matriz cuadrada de dimensión máxima
- 50x50 y haga lo siguiente:
-
- - Imprima la media de los elementos de la diagonal principal.
-
- - Imprima la suma de los elementos por debajo de la diagonal principal
- y por encima de ella.
- ende
- begine "prpr"
- Una fábrica de automóviles produce 4 modelos de coches cuyos precios
- de venta son respectivamente 1.5, 1.75, 2.42 y 2.6 millones de pesetas.
-
- Esta empresa cuenta con cuatro centros de distribución y venta. Se
- dispone de una relación de datos correspondientes al tipo de vehículo
- vendido y punto de distribución en que se produjo la venta del mismo.
-
- Realizar un programa que leyendo la relación de datos anterior, calcule
- e imprima:
-
- 1.- Volumen de ventas total.
-
- 2.- Volumen de ventas por centro.
-
- 3.- Porcentaje de unidades totales vendidas en cada centro.
-
- 4.- Porcentaje de unidades de cada modelo vendidos en cada centro,
- sobre el total de ventas de la empresa.
- ende
- begine "prpr"
-
- Son números primos aquéllos divisibles solamente entre sí mismos y 1.
- Para localizar los números primos del 1 al 1000, puede empezarse con
- 2 y dividir todos los números mayores entre 2, con la eliminación de
- los que no tengan residuo para pasar después al mayor número que no
- haya sido eliminado y dividirlo de la misma forma. Este es un método
- directo que se basa en la definición. Sin embargo, se requiere mucho
- tiempo porque la división es larga. Una forma más rápida consiste en
- utilizar el procedimiento de la criba de Erastótenes:
-
- Llena un vector con valores del 1 al 1000. Empieza con el segundo
- valor para igualar a 0 todos los múltiplos en el vector (todos los
- múltiplos de 2, esto se consigue en el programa C con incrementos
- de la variable índice de 2 en 2). Sigue, con el siguiente número
- diferente de cero y repite el proceso sucesivamente. Concluido el
- proceso, todas las anotaciones diferentes de cero serán números
- primos. Escribe un programa para utilizar este procedimiento e
- imprimir una tabla de números primos.
- ende
- begine "prpr"
-
- Realizar una función que acepte tres vectores: A, B y C. Los vectores
- A y B son dos vectores ordenados en orden creciente de números enteros,
- sus longitudes no tienen porqué ser iguales. Nuestra función ha de
- rellenar el vector C (cuya longitud es la suma de las longitudes de los
- vectores A y B) intercalando A y B, de tal forma que al final del pro-
- ceso el vector C es un vector ordenado en orden creciente con los
- números enteros de los vectores A y B.
- ende
- begine "prpr"
-
- Dado un vector X de n elementos enteros en que n es impar, escribir un
- programa que calcule la mediana del vector. La mediana es un valor su-
- perior a la mitad del número de elementos del vector e inferior a la
- otra mitad. Por ejemplo, dado el vector X
-
- X1 X2 X3 X4 X5 X6 x7 X8 X9
- 17 -3 21 2 9 -4 6 8 11
-
- de nueve elementos, la ejecución del programa debería dar el valor 8.
- ende
- begine "prpr"
-
- Una matriz A de dimensión nxm es simétrica si
-
- a(i,j) = a(j,i) para 1≤i≤n y 1≤j≤m
-
- Escribir un programa que lea una matriz (de dimensión no mayor de
- 10x10) y determine si es simétrica o no. Supóngase que los elementos
- de la matriz son enteros.
-
- Ejemplo de matriz simétrica:
-
- ┌ ┐
- │ 1 4 7 │
- │ 4 2 9 │
- │ 7 9 3 │
- └ ┘
- ende
- begine "test"
- pregunta
- ¿Son equivalentes las dos sentecias printf() siguientes?
- printf (expresion_cadena_1, expresion_cadena_2);
- printf ((expresion_cadena_1, expresion_cadena_2));
- opciones
- No lo son
- Sí lo son
- respuesta
- 1
- ende
- end lección 6
-
- ; LECCION 7
- begin
- begine "psc"
- pregunta
- ¿De qué tipo es esta variable?
- double *pd;
- respuesta
-
- pd es un puntero a double.
- ende
- begine "test"
- pregunta
-
- ¿Cuáles son los dos operadores especiales de punteros?
- opciones
- && y *
- & y *
- || y *
- | y *
- & y |
- & y +
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- Al operador & se le suele llamar operador de dirección y al operador *
- se le suele llamar operador de contenido. Si p es un puntero a float,
- ¿qué diferencia hay entre las expresiones p, &p y *p?
- respuesta
- p contiene la dirección de memoria a la que apunta el puntero; &p es
- la dirección de memoria donde está ubicada la variable puntero; y *p
- es el valor que hay en la posición de memoria apuntada por el puntero.
- ende
- begine "psc"
- pregunta
-
- ¿Qué diferencia hay entre las expresiones v y *&v?
- respuesta
-
- No hay ninguna diferencia, son expresiones equivalentes.
- ende
- begine "pcc"
- pregunta
- Sea el tamaño del tipo long 4 bytes y supongamos la declaración:
- long *pl; Si pl apunta a la dirección (en decimal) 5000, al hacer
- pl += 2; ¿qué valor toma pl?
- respuesta
- 5008
- ende
- begine "test"
- pregunta
- Sea la declaración:
- int *pi;
- Qué valor toma la expresión: sizeof (*pi) == sizeof (int).
- opciones
- valor cierto (1)
- valor falso (0)
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Qué funcion(es) hemos visto en esta lección para asignar y desasignar
- memoria dinámicamente?
- respuesta
- Para asignar memoria dinámicamente hemos vista las funciones malloc()
- y calloc(). Y para liberar memoria tenemos la función free().
- ende
- begine "psc"
- pregunta
- ¿Qué hace la siguiente sentencia C?
- p = (float *) malloc (n * sizeof (float));
- respuesta
- La expresión malloc (n*sizeof(float)) reserva (n*sizeof(float)) bytes de
- memoria. Al moldearlo con (float *) y asignarlo a p, p se convierte en un
- array de n elementos de tipo float (en realidad, p es un puntero al ppio).
- ende
- begine "psc"
- pregunta
-
- ¿Cuándo se libera la memoria asignada dinámicamente?
- respuesta
- La memoria se libera bien al acabar el programa o bien al utilizar una
- función de liberación de memoria dinámica como free().
- ende
- begine "test"
- pregunta
- ¿Es cierta o falsa esta expresión?
- v[i] == *(v+i)
- opciones
- Cierta
- Falsa
- respuesta
- 1
- ende
- begine "test"
- pregunta
-
- ¿Qué notación es más eficiente, la de array o la de puntero?
- opciones
- Notación array
- Notación puntero
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Ocupa el mismo espacio de memoria las 2 declaraciones siguientes?
- int x[10][10], *y[10];
- respuesta
- No. Si sizeof (int) == 2, la primera declaración reserva 10x10x2
- bytes de memoria; mientras que la segunda, si sizeof (int *) == 2,
- reserva 10x2 bytes de memoria.
- ende
- begine "psc"
- pregunta
-
- ¿Adónde apunta un puntero que tenga el valor NULL?
- respuesta
-
- A ningún sitio.
- ende
- begine "test"
- pregunta
- Sea:
- int *x, y;
- ¿Qué opción del menú es la cierta?
- opciones
- x e y son punteros a int
- x e y son de tipo int
- x es un puntero a int e y es de tipo int
- x es de tipo int e y es un puntero a int
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿De qué tipo es la variable pf?
- float (*pf) (float, float);
- respuesta
- pf es un puntero a una función que devuelve un número de tipo float
- y acepta como argumentos dos números de tipo float.
- ende
- begint
- begine "test"
- pregunta
- ¿En qué librería de Turbo C están definidas las funciones qsort(),
- bsearch(), lfind() y lsearch()?
- opciones
- <stdio.h>
- <stdlib.h>
- <alloc.h>
- <conio.h>
- respuesta
- 2
- ende
- endt
- begine "psc"
- pregunta
- ¿Por qué se produce un error de compilación en esta línea?
- int x = 10, y; void *pv; pv = (void *) &x; y = *pv;
- respuesta
- El único error que existe en la línea anterior está en la sentencia y=*pv;
- y más concretamente en la expresión *pv. Esto es debido a que las opera-
- ciones con punteros están ligada al tipo base. Correcto: y = *(int *)pv;
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia hay entre las dos sentencias siguientes;
- x += y;
- x =+ y;
- respuesta
- La sentencia (x += y) es equivalente a (x = x + y); y la sentencia
- (x =+ y) es equivalente a (x = (+y)).
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia hay entre las dos sentencias siguientes;
- x *= y;
- x =* y;
- respuesta
- Si y es un puntero, la primera sentencia es incorrecta porque no se puede
- aplicar el producto a los punteros. Si y no es un puntero, la segunda sen-
- tencia es incorrecta porque se le está aplicando el operador de contenido.
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia hay entre las dos sentencias siguientes;
- x &= y;
- x =& y;
- respuesta
- Si x es un puntero, la primera sentencia es incorrecta porque no se puede
- aplicar el and de bits a punteros. Si x no es un puntero, la segunda sen-
- tencia es incorrecta porque se le está intentando asignar una dirección.
- ende
- begine "test"
- pregunta
- Sea la declaración
- int x;
- ¿podemos hacer: *(const int *)&x = 20;?
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿De qué tipo es la variable x?
- const char * (* x) (char * const, const char * const);
- respuesta
- x es un puntero a función que devuelve un puntero a constante char
- y acepta dos argumentos: el primero es un puntero constante a char
- y el segundo es un puntero constante a constante char.
- ende
- begint
- begine "test"
- pregunta
- ¿Qué opción del menú podemos asegurar que es cierta considerando
- esta declaración?
- float *p;
- opciones
- p es un puntero near
- p es un puntero far
- p es un puntero huge
- p es un puntero near, far o huge dependiendo del modelo de memoria elegido
- respuesta
- 4
- ende
- begine "test"
- pregunta
- ¿Cuál de las opciones del menú no corresponde a un modelo de memoria de
- compilación en Turbo C?
- opciones
- Tiny
- Small
- Medium
- Compact
- Large
- Big
- Huge
- respuesta
- 6
- ende
- endt
- begine "prpr"
-
- Escribe un programa que acepte como entrada una cadena de un texto
- y sustituya todos los conjuntos de dos o más espacios seguidos por
- espacios únicos.
- ende
- begine "prpr"
-
- Escribe un programa que lee dos fechas y calcule e imprima la
- diferencia en días que hay entre las dos fechas introducidas.
-
- Las fechas serán cadenas de caracteres con el fomato: "dd/mm/aa".
-
- Nota: Sería conveniente diseñar una función que acepte como
- argumento un string conteniendo la fecha y devuelve 1 si el
- string contiente una fecha correcta o 0 en caso contrario. Para
- que la fecha sea convalidada, ésta debe superar las siguientes
- pruebas:
-
- - La longitud del string correspondiente a la fecha es de 8
- caracteres.
- - Los caracteres tercero y sexto son /.
- - Los restantes caracteres son números.
- - El valor del mes tiene que estar entre 1 y 12.
- - El valor del día tiene que estar 1 y el número de días de
- ese mes.
-
- Si se quiere tener en cuenta los años bisiestos recordar que
- aquellos años divisibles de forma exacta por 4 son bisiestos, y
- que el número de años bisiestos transcurridos desde el princi-
- pio del siglo es la parte entera del cociente año/4.
-
- ende
- begine "prpr"
-
- Implementar las funciones que se describen a continuación junto
- con una función main para probarlas.
-
- Las funciones a implemetar son:
-
- - Función que acepte dos strings: s1 y s2, y devuelva el número
- de caracteres que hay en s1 que no están en s2.
-
- - Función que acepte dos strings: s1 y s2, y devuelva el número
- de caracteres que hay en s1 que están en s2.
-
- - Función que acepte un string que puede contener caracteres
- repetidos y lo devuelva sin ningún carácter repetido en su
- interior.
-
- - Función que acepte un substring y un número n y devuelva un
- string con tantas copias del substring como indique el número n.
-
- - Función que acepte un string y lo devuelva con todos sus carac-
- teres convertidos en mayúsculas. Los caracteres con código ascii
- mayor de 127: ñ, á, é, í, ó y ú serán convertidos respectivamente
- a: Ñ, A, E, I, O, U.
-
- ende
- end lección 7
-
- ; LECCION 8
- begin
- begine "psc"
- pregunta
- ¿Cuántos bytes ocupa en memoria la variable st?
- struct { float f; char *pc; } st;
- respuesta
-
- sizeof (st) == sizeof (float) + sizeof (char *)
- ende
- begine "psc"
- pregunta
- ¿De qué tipo son las variables st1, st2 y st3?
- struct st { int x, y; } *st1, st2, st3[10];
- respuesta
- st1 es un puntero a struct st
- st2 es un struct st
- st3 es un array de 10 elementos de tipo struct st
- ende
- begine "test"
- pregunta
- Dada la declaración
- struct x { int x; } x;
- ¿qué operación de entre las que aparece en el menú es falsa?
- opciones
- struct x y;
- x = 10;
- x.x = 20;
- x.x = sizeof (x);
- x.x = sizeof (x.x);
- x.x = sizeof (struct x);
- x.x = sizeof (struct x *);
- x.x = *&x.x;
- x.x = sizeof (x) == sizeof (struct x);
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- Dado
- struct { int y[10]; } x[10];
- ¿qué diferencia hay entre las expresiones x[2].y[3] y (x[2].y)[3]?
- respuesta
- No hay ninguna diferencia puesto que los paréntesis no alteran
- la precedencia. Nota: serían expresiones incorrectas en C las dos
- siguientes: x[2](.y[3]) y x[2].(y[3])
- ende
- begine "test"
- pregunta
- ¿Cuál es la expresión equivalente a la asignación siguiente y que
- es además la única que no provoca un error de compilación?
- struct { int x, y; } *st; st->x = 100;
- opciones
- (*st).x = 100;
- *st.x = 100;
- *(st.x) = 100;
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿En qué caso es conveniente pasar una estructura íntegra en lugar de un
- puntero a una estructura como argumento a una función?
- respuesta
- Nunca: siempre es mejor pasar el puntero a la estructura. Si se desea que
- la función llamadora no modifique la estructura, declaramos un puntero a
- estructura constante: tipo funcion (const struct nombre_estructura *);
- ende
- begine "psc"
- pregunta
-
- ¿Son necesarios los campos de bits en C?
- respuesta
- Los campos de bits no son necesarios en C, puesto que todas las opera-
- ciones que se pueden realizar con los campos de bits también se pueden
- realizar con los operadores de bits (&, |, ~, ^).
- ende
- begine "test"
- pregunta
- ¿Cuántos bytes ocupa en memoria la variable st?
- struct { int x; union { char ch; float f; } u; } st;
- opciones
- sizeof (st.x) + sizeof (st.u)
- sizeof (int) + sizeof (char) + sizeof (float)
- sizeof (int)
- sizeof (float)
- respuesta
- 1
- ende
- begine "PCC"
- pregunta
- ¿Qué imprime la sentencia printf?
- enum { a = 10, b, c = 20 } e = b;
- printf ("e = %d", e);
- respuesta
- e = 11
- ende
- begine "psc"
- pregunta
- typedef int ent;
- typedef ent *pe;
- pe (*var) (ent); /* ¿de qué tipo es la variable var? */
- respuesta
- La variable var es un puntero a una función que devuelve un
- puntero a entero y acepta como argumento un entero.
- ende
- begine "test"
- pregunta
- Los operadores que tienen más prioridad en C son (), [], ->, .
- y su asociatividad es de izquierda a derecha.
- opciones
- Afirmación cierta
- Afirmación falsa
- respuesta
- 1
- ende
- begine "test"
- pregunta
- El operador que tiene menos prioridad en C es el operador coma (,)
- y después le siguen los operadores de asignación.
- opciones
- Afirmación cierta
- Afirmación falsa
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los operadores que se asocian de derecha a izquierda?
- respuesta
- Los operadores unarios, el operador condicional ? y los operadores
- de asignación.
- ende
- begine "prpr"
-
- Diseñar un programa que lea dos árboles binarios y muestre un mensaje
- diciciendo si los dos árboles son iguales.
- ende
- begine "prpr"
-
- Diseñar un programa que lea un árbol binario, lo copie a otro árbol
- binario exceptuando las hojas del primero (el segundo árbol binario
- será igual que el primero pero sin las hojas de él) y lo imprima.
-
- Por ejemplo, si el árbol binario introducido es:
-
- 6
- / \
- 2 10
- / \ \
- 0 3 12
- / / \
- 1 11 20
-
- El árbol a crear será:
-
- 6
- / \
- 2 10
- \ \
- 3 12
-
- ende
- begine "prpr"
-
- Diseñar un programa que lea dos árboles binarios y forme e imprima
- otro árbol binario cuya información sea la suma de las correspon-
- dientes informaciones númericas contenidas en los dos árboles leídos.
-
- Se supone que si no existe el correspondiente nodo en alguno de los
- árboles se supondrá que la información contenida en el nodo de dicho
- árbol es cero.
- ende
- begine "prpr"
-
- Se desea construir una estructura dinámica de datos como la que se
- muestra en la figura:
-
- lista_numerica ──────────────────┐
- │
- lista_alfabetica ─┐ │ ┌──────────────────────┐
- ┌─┼───────────────────┼─┼────────────────────┐ │
- ┌──┬───────┬┼┬┐ ┌──┬───────┬┬┼┐ ┌──┬───────┬┬┐
- │10│Manolo │ │ │ │ 5│Juan │ │ │ │15│Antonio│ │ │
- └──┴───────┴┴┼┘ └──┴───────┴┼┴┘ └──┴───────┴─┴─┘
- └─┼───────────────────┘ │
- └─────────────────────┘
- Como se ve, uno de los campos puntero enlaza nodos por orden ascendente
- de la clave numérica (5, 10, 15, ...), y el otro por orden descendente
- de la clave alfabética (Manolo, Juan, Antonio, ...).
-
- Se debe escribir un programa que permite realizar operaciones de in-
- sertar, eliminar y buscar elementos (número entero y cadena de carac-
- teres), además de listar todos los elementos según la clave deseada
- (numérica o alfabética).
-
- ende
- begine "prpr"
-
- Diseñar un programa que forme un árbol binario de números enteros
- introducidos por el usuario e imprima la información contenida en
- cada nodo por niveles. Es decir, primero el nodo raíz (nivel 0),
- luego sus hijos (nivel 1), después los hijos de éstos (nivel 2) y
- así sucesivamente.
-
- La función del recorrido del árbol por niveles puede hacerse con el
- siguiente pseudocódigo:
-
- <Construir una cola vacía cuyos nodos contengan un puntero a nodos
- del árbol y un entero para indicar el correspondiente nivel>
-
- <Incluir en la cola un primer nodo que contenga un puntero al nodo
- raíz y el nivel 0 e inicializar un puntero p, que señalando a nodos
- de la cola, señale a ese primer nodo>
-
- MIENTRAS (p no sea nulo)
-
- <Añadir a la cola los punteros a los hijos del nodo del árbol cuyo
- puntero está incluido en la cola y apuntado por p, así como sus
- correspondientes niveles>
-
- <Hacer p igual al siguiente de p>
-
- FINMIENTRAS
-
- <Imprimir la información contenida en los nodos del árbol señalados
- por los sucesivos punteros de la cola y los correspondientes niveles>
-
- ende
- begine "prpr"
-
- Desarrollar un programa que realice la suma de dos polinomios.
-
- Los dos polinomios se representan en listas lineales encabezadas por
- p y q, el polinomio resultado está encabezado por el puntero r.
-
- La información contenida en cada nodo de las listas está compuesta de
- coeficiente y exponente.
-
- Nota: las listas no están ordenadas ni respecto a los coeficientes ni
- respecto a los exponentes.
- ende
- begine "prpr"
-
- Supóngase que se está haciendo un cierto tratamiento con una serie de
- municipios de diversas provincias, para ello se utiliza la siguiente
- estructura: unas listas "horizontales" formadas cada una de ellas por
- municipios pertenecientes ala misma provincia y una lista "vertical"
- formada por todas las cabeceras de cada una de las listas horizontales.
-
- Se pide:
-
- 1) Implementar las funciones necesarias para buscar en la estructura
- un municipio dado de una provincia dada. Si está se devolverá un pun-
- tero al nodo correspondiente; en caso contrario el puntero devolverá
- valor NULL.
-
- 2) Insertar en la estructura un municipio dado de una provincia dada
- teniendo en cuenta los siguientes puntos:
-
- - Si el municipio pertenece a una provincia ya existente, se
- insertará el nuevo elemento al principio de la lista horizontal
- correspondiente.
-
- - Si el municipio pertenece a una provincia nueva, se deberá
- insertar al final de la lista vertical la nueva provincia que
- deberá tener una lista horizontal de un único elemento: ese
- municipio.
-
- ende
- begine "prpr"
-
- Diseñar un programa para manipular una cola.
-
- Una cola es una estructura de datos en la que el primer elemento
- introducido es el primero en salir.
-
- Las únicas operaciones que se pueden realizar con una cola son:
-
- - Inicializarla.
- - Introducir un elemento.
- - Sacar un elemento.
- - Liberar nodos.
-
- Hay dos estructuras posibles para la implementación de una cola:
-
- 1) Una lista lineal enlazada con dos punteros de cabecera: uno que
- apunta al primer nodo de la lista y otro que apunta al último
- nodo de la lista.
-
- 2) Una lista lineal enlazada circular donde el puntero de cabecera
- apunta al último nodo de la lista y el puntero siguiente de este
- último nodo apunta al primer nodo de la lista.
-
- ende
- begine "prpr"
-
- Diseñar algoritmos no recursivos para hacer recorridos inorden,
- preorden, postorden y por niveles en un árbol binario.
-
- Consejo: para ello es conveniente utilizar pilas y colas.
- ende
- begine "prpr"
- Diseñar un programa para manejar un árbol n-ario
-
- Un árbol n-ario (también llamados multicaminos) es un árbol donde
- cada nodo puede tener n hijos. Por ejemplo, un nodo puede tener 2
- hijos, otro 10 hijos, otro 1, ...
-
- Una estructura adecuada para implementar un árbol n-ario es que en
- vez de utilizar un puntero al hijo izquierdo y un puntero al hijo
- derecho como en los árboles binarios, utilizamos un puntero a una
- lista lineal enlazada donde cada nodo de esta lista apunta a un
- nodo hijo del nodo del árbol al que pertenece dicha lista. Las
- inserciones en la lista han de ser al final de ésta para conservar
- el orden de los nodos hijos; para facilitar las inserciones en la
- lista es conveniente que ésta sea circular y el puntero a la cabe-
- cera de la lista apunte al último nodo de ella.
-
- Realizar también una función que recibe un puntero a un árbol n-ario
- y devuelve un puntero a un árbol binario equivalente al árbol n-ario
- recibido.
- ende
- end lección 8
-
- ; LECCION 9
- begin
- begine "test"
- pregunta
-
- ¿Cuál es la salida estándar por defecto?
- opciones
- Teclado
- Pantalla
- Impresora
- Disco
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Cuántos flujos se asocian con un fichero cuando se abre el fichero?
- opciones
- Ninguno
- Uno
- Dos
- Depende de la forma en que se abra el fichero
- Depende del tipo de fichero
- Depende del tipo de flujo
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Cuál es la diferencia principal entre los flujos de texto y los
- flujos binarios?
- respuesta
- La diferencia principal es que la correspondencia de caracteres entre
- el flujo y el fichero es de uno a uno en el caso de los flujos binarios,
- y no siempre es de uno a uno en el caso de los flujos de texto.
- ende
- begine "test"
- pregunta
-
- ¿Qué son los identificadores stdin, stdout y stderr?
- opciones
- Palabras claves de C.
- Tipos definidos.
- Constantes simbólicas.
- Variables globales.
- respuesta
- 4
- ende
- begint
- begine "psc"
- pregunta
- ¿Cuáles son los flujos predefinidos que añade Turbo C a los tres
- flujos predefinidos del ANSI C (stdin, stdout y stderr)?
- respuesta
- Los dos flujos predefinidos que añade TURBO C al ANSI C son:
- stdaux y stdprn.
- ende
- endt
- begine "psc"
- pregunta
-
- ¿De qué tipo son las variables stdin, stdout y stderr?
- respuesta
- Las variables stdin, stdout y stderr son punteros a ficheros:
- FILE *stdin, *stdout, *stderr;
- ende
- begine "test"
- pregunta
- ¿Es cierta la siguiente afirmación? Los flujos predefinidos stdin,
- stdout y stderr se abren automáticamente al principio del programa
- y se cierran automáticamente al final del programa.
- opciones
- Afirmación cierta
- Afirmación falsa
- respuesta
- 1
- ende
- begint
- begine "psc"
- pregunta
-
- ¿Cómo se puede escribir en impresora en Turbo C?
- respuesta
- Utilizando el flujo stdprn. Por ejemplo, con la función fprintf se
- escribiría: fprintf (stdprn, "mensaje");
- ende
- endt
- begine "psc"
- pregunta
- ¿Cuáles son los cuatro pasos principales para poder trabajar
- con un fichero?
- respuesta
- Los cuatro pasos son:
- 1) Declarar variable fichero. 2) Abrir el fichero.
- 3) Operar con el fichero. 4) Cerrar el fichero.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son las funciones de apertura y cerrado de ficheros?
- respuesta
- Los ficheros se abren con la función fopen() y se cierran con la función
- fclose(). El valor devuelto por fopen() es necesario comprobarlo siempre.
- El valor devuelto por fclose() es frecuente no comprobarlo.
- ende
- begine "psc"
- pregunta
- ¿Cuál es la principal diferencia entre las funciones printf(),
- fprintf(), sprintf() y cprintf() (esta última sólo en Turbo C)?
- respuesta
- La diferencia es el destino de la salida. La salida de printf() va a la
- salida estándar, la de fprintf() va a un fichero, la de sprintf() va a
- un string y la de cprintf() (sólo en Turbo C) va a la consola (pantalla).
- ende
- begine "psc"
- pregunta
-
- ¿Qué significa volcar un fichero?
- respuesta
- Si el flujo está asociado con un fichero de salida, significa copiar la
- información que hay en el buffer de salida al fichero. Si el flujo está
- asociado con un fichero de entrada, significa vaciar el buffer de entrada.
- ende
- begine "psc"
- pregunta
- ¿Cómo serían los bucles while para leer un fichero de texto y un
- fichero binario si se lee carácter a carácter?
- respuesta
- /* fichero binario */ /* fichero de texto */
- for (getc (pfb); ! feof (pfb); getc (pfb)) while (getc (pft) != EOF)
- ; ;
- ende
- begine "psc"
- pregunta
- En C se suele trabajar con el sistema de ficheros de alto nivel
- en el que a cada fichero se le asocia un flujo. Pero hay otro más
- antiguo y en desuso actualmente, ¿cuál es?
- respuesta
- El sistema de ficheros preguntado es el sistema de ficheros de
- bajo nivel, llamado también sistema de ficheros tipo UNIX o E/S
- sin buffer.
- ende
- begine "psc"
- pregunta
-
- ¿Qué es un descriptor de fichero?
- respuesta
- Un descriptor de fichero es un número entero que se asocia a cada
- fichero abierto en C cuando se trabaja con el sistema de ficheros
- de bajo nivel.
- ende
- begine "psc"
- pregunta
- ¿Cuáles son las funciones equivalentes a fopen() y fclose() en el
- sistema de ficheros de bajo nivel?
- respuesta
- Las funciones equivalentes a fopen() y fclose() en el sistema de
- ficheros de bajo nivel son open() y close() respectivamente.
- ende
- begine "test"
- pregunta
- ¿Es portable hoy día un programa que utilice el sistema de ficheros
- de bajo nivel?
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "prpr"
- /*
- Este programa concatena varios ficheros y los presenta en la salida
- estándar (la pantalla normalmente). Si redireccionamos la salida
- (con >) concatenamos varios ficheros en otro fichero. Si no hay ningún
- argumento, se lee de la estrada estándar (el teclado normalmente).
- */
-
- #include <stdio.h> /* FILE, stdin, fopen (), NULL, fprintf (), stderr,
- fclose (), getc (), putc (), stdout */
- #include <stdlib.h> /* exit () */
-
- void main (int argc, char *argv[])
- {
- FILE *pf;
- void copiar_fichero (FILE *pf);
-
- if (argc == 1) /* ningún argumento; copiar la entrada estándar */
- copiar_fichero (stdin);
- else
- while (--argc)
- if ((pf = fopen (*++argv, "r")) == NULL)
- {
- fprintf (stderr, "\nError: No se puede abrir el fichero %s.\n",
- *argv);
- exit (1);
- }
- else
- {
- copiar_fichero (pf);
- fclose (pf);
- }
- }
-
- /* copiar el fichero pf en la salida estándar */
- void copiar_fichero (FILE *pf)
- {
- int c;
-
- while ((c = getc (pf)) != EOF)
- putc (c, stdout);
- }
-
- /*
- La propuesta de programa que se propone es cambiar este programa
- para que el primer argumento leído desde la línea de órdenes del
- sistema operativo sea el fichero de destino y todos los demás ar-
- gumentos son los ficheros de entrada que se han de concatener en
- orden en el fichero de destino. De este modo no necesitamos re-
- direccionar el programa como en el ejemplo. Si el usuario ejecuta
- el programa sin ningún argumento se le informa con un mensaje de
- error.
- */
- ende
- begine "prpr"
-
- Implementar las funciones de librería fgets() y fputs(), utilizando
- en el primer caso la función getc() y en el segundo la función putc().
- ende
- begine "prpr"
-
- Hacer un programa que acepte varios argumentos desde la línea de
- comando del sistema operativo en la forma:
-
- nombre_programa "texto" fichero_1 fichero_2 ...
-
- es decir, que el primer argumento sea un texto entre comillas y a
- partir del segundo argumento, inclusive el segundo, una serie de
- ficheros.
-
- El programa tiene que decir el nombre del fichero y el número de
- línea de este fichero en el cual aparece la primera ocurrencia de
- texto.
- ende
- begine "prpr"
-
- Hacer un programa que lea un fichero de texto y escriba el número
- de líneas y el número de caracteres que tiene ese fichero.
- ende
- begine "prpr"
-
- Construir un programa que lee un fichero de texto e imprima una lista
- de todas las palabras aparecidas en el fichero junto con los números
- de líneas en las que aparecen. La lista de palabras se escribe en orden
- alfabético y la lista de números de línea para cada palabra se escriben
- de menor a mayor.
-
- Ejemplo:
-
- Fichero de texto:
-
- 1 Se considera como palabra
- 2 una sencuencia de caracteres
- 3 entre dos espacios o
- 4 caracteres de nueva línea.
- 5 Posible estructura: árbol con un
- 6 campo para el string línea y otro
- 7 campo contiene un puntero al
- 8 principio de una lista ordenada
- 9 que contiene los números de líneas.
-
- Salida:
-
- al 7
- campo 6 7
- caracteres 2 4
- como 1
- considera 1
- con 5
- contiene 7 9
- de 2 4 8 9
- dos 3
- el 6
- entre 3
- espacios 3
- estructura: 5
- línea 4 6
- líneas 9
- lista 8
- los 9
- nueva 4
- números 9
- o 3
- ordenada 8
- otro 6
- palabra 1
- para 6
- posible 5
- principio 8
- puntero 7
- que 9
- Se 1
- secuencia 2
- string 6
- un 5 7
- una 2 8
- y 6
- árbol 5
-
- ende
- begine "prpr"
- Queremos implementar una estructura de datos que represente el servicio
- de autobuses de una ciudad, teniendo en cuentra que las paradas estarán
- representadas por un carácter y las líneas de autobuses por números.
-
- La estructura resultante ha de ser una lista de nodos con todas las
- paradas de la ciudad, y asociado a cada parada una sola lista con la
- información de los autobuses que pasan por ella y una referencia a
- la siguiente parada para cada línea.
-
- 1.- Codificar un programa en C que construya la anterior estructura a
- partir de un fichero de texto con la siguiente información: una línea
- de texto por cada línea de autobús, de forma que primero figure el
- número de línea y después en orden de adyacencia las paradas de esa
- línea.
-
- 2.- Construir en C una función que reciba una lista de paradas inter-
- medias y devuelva si es o no posible hacer ese recorrido y cuál sería
- la sucesión de autobuses que se habría de coger. Suponer que entre dos
- paradas sólo hay una posible línea.
- ende
- begine "prpr"
-
- Una característica importante de las funciones fread() y fwrite() es
- que permiten leer y escribir estructuras respectivamente, es decir,
- que podemos trabajar con lo que se llama en lenguajes de gestión:
- registros.
-
- Supongamos que tenemos declarada la variable vst que es del tipo
- compuesto estructura:
-
- struct st vst;
-
- entonces podemos escribir un registro de tipo struct st en el fichero
- pf de la siguiente forma:
-
- fwrite (&vst, sizeof (struct st), 1, pf);
-
- y leer registros de la siguiente forma:
-
- fread (&vst, sizeof (struct st), 1, pf);
-
- Cuando se va a trabajar con estructuras como la descrita conviene
- abrir el fichero en modo binario, ya que se suele abrir en modo
- texto cuando lo vamos a procesar línea a línea.
-
- Después de esta introducción vamos a proponer un programa que trabaje
- con registros de ficheros:
-
- Un fichero de referencia de los libros de una biblioteca está consti-
- tuido por registros del siguiente tipo:
-
- a) Número de referencia del libro, entero. No hay números de
- referencia repetidos.
- b) Autor, 25 caracteres.
- c) Título del libro, 50 caracteres.
- d) Tema del libro, 8 caracteres.
-
- Este fichero se denomina LIBROS.DAT, y viene ordenado por números de
- referencia.
-
- Realizar un programa que permita altas, bajas y consultas con el
- fichero LIBROS.DAT.
-
- Una vez que tenemos el fichero LIBROS.DAT, se debe realizar otro
- programa que haga lo siguiente: partiendo de dicho fichero, se tiene
- que formar primero una lista encadenada en memoria, por orden alfa-
- bético del tema, y a igualdad de tema, por orden alfabético del autor,
- y a igualdad de autor, por orden del número de referencia. Una vez
- formada dicha lista, el programa debe generar a partir de ella tantos
- ficheros como temas haya. Cada fichero tendrá el nombre del tema, sin
- extensión, y estará formado por los registros de los libros de dicho
- tema, conteniendo cada registro el número de referencia, el autor y
- el título, con tamaños iguales a los del fichero de entrada.
-
- ende
- begine "prpr"
-
- Realizar un programa para el mantenimiento de los miembros de una aso-
- ciación de ámbito provincial, según los criterios siguientes:
-
- a) Al arrancar el programa, en primer lugar, leerá de un fichero de
- SOCIOS los datos de los mismos, formando con ellos una lista en-
- cadenada. Los registros del fichero de entrada están en orden al-
- fabético, por lo que se irán encadenando uno tras otro en el mis-
- mo orden en que sean leído.
-
- b) Tras esta operación, ofrecerá repetitivamente un menú con las
- opciones 1-ALTA, 2-BAJA, 3-CONSULTA y 4-FIN. Los procesos de alta
- y de baja mantendrán la lista encadenada en orden alfabético. No
- se admitirán nombres repetidos.
-
- c) Al terminar el programa (opción 4-FIN), se reescribirá el fichero
- SOCIOS, con los datos actualizados que se tengan en la lista enca-
- denada.
-
- d) Los registros del fichero se atienen al siguiente formato:
- 1-Nombre: 30 caracteres.
- 2-Domicilio: 30 caracteres.
- 3-Teléfono: entero.
- 4-Código postal: entero en el rango 1 al 999.
-
- e) En el proceso de alta se leerán de teclado todos los datos del
- nuevo socio. En el proceso de baja se leerá sólo el nombre. En
- el proceso de consulta, se leerá sólo el nombre y se mostrarán
- todos los datos en pantalla.
-
- ende
- begine "prpr"
-
- Un fichero de datos binario, de nombre PRECIOS.DAT, contiene registros
- formados como sigue:
-
- a) Identificación de un producto, 10 caracteres más el terminador.
- b) El precio en pesetas de dicho producto, un entero.
-
- Un segundo fichero contiene los datos de las sucesivas operaciones de
- venta a lo largo de un período de tiempo. El fichero, igualmente bi-
- nario, de nombre VENTAS.DAT, contiene registros formados por:
-
- a) Identificador del producto, como en el fichero anterior.
- b) Número de unidades vendidas de dicho producto, un entero.
-
- En este fichero, van consecutivos todos los elementos correspondientes
- a la misma operación de venta, terminando cada operación con un regis-
- tro que contiene un asterisco como único carácter identificador de pro-
- ducto, lo que cierra la factura de la operación, y a continuación sigue
- otra operación de venta de la misma manera, o el final del fichero.
-
- Realizar un programa que:
-
- 1.- Gestione los dos ficheros anteriores: altas, bajas, consultas y
- modificaciones.
-
- 2.- A partir del fichero de precios, construya un árbol binario orde-
- nado por identificadores de productos.
-
- 3.- A partir del fichero de ventas, imprima las facturas de las dis-
- tintas operaciones, según el modelo siguiente:
-
- UNIDADES ARTICULO PRECIO UNITARIO IMPORTE
- 10 patatas 40 400
- .. ....... ..... ......
- 12 leche 110 1320
-
- IMPORTE TOTAL ........................ 6850
-
- ende
- begine "prpr"
-
- Se han recogido en un fichero secuencial denominado VIAJES las
- informaciones relativas a todos los desplazamientos profesionales
- efectuados en una empresa durante un año. Cada vez que se produce
- un desplazamiento se crea un registro que consta de lo siguientes
- campo:
-
- - Nombre de la ciudad a donde se realizó el desplazamiento.
- - Fecha del desplazamiento.
- - Número de días de duración del desplazamiento.
- - Nombre de la persona que se ha desplazado.
-
- Estos datos se han registrado por orden cronológico y por lo tanto
- las informaciones no aparecen por el orden de los nombres de las
- ciudades.
-
- Se quiere obtener un listado ordenado alfabéticamente por ciudad
- donde aparezcan para cada ciudad:
-
- 1º El número de viajes realizados.
- 2º El coste de las dietas.
- 3º El coste medio por día de estancia en esa ciudad.
- 4º Al final del listado se imprimirá el coste total de las dietas
- para la empresa.
-
- El número de ciudades es inferior a 100.
-
- ende
- end lección 9
-
- ; LECCION 10
- begin
- begine "test"
- pregunta
-
- ¿Cuál es el uso más común de la macro NULL?
- opciones
- Para indicar el final de una cadena de caracteres.
- Para indicar que un puntero no apunta a ningún sitio.
- Para indicar el final de fichero en las operaciones de E/S.
- respuesta 2
- ende
- begint
- begine "test"
- pregunta
-
- ¿Qué fichero de cabecera contiene las funciones de manejo de caracteres?
- opciones
- limits.h
- ctype.h
- string.h
- mem.h
- values.h
- stdio.h
- stdlib.h
- locale.h
- respuesta
- 2
- ende
- endt
- begine "test"
- pregunta
- ¿Podemos asegurar que en la siguiente sentencia la asignación de
- y a x se realiza una sola vez en todos los compiladores de C?
- isspace (x = y);
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Cuál es el resultado de esta expresión?
- x = isxdigit ('f') ? y : z;
- opciones
- y
- z
- 'f'
- 1
- 0
- indefinido
- respuesta
- 1
- ende
- begine "pcc"
- pregunta
- ¿Qué imprime la sentencia printf()?
- printf ("%d", strcmp ("A", "C"));
- respuesta
- -2
- ende
- begine "test"
- pregunta
-
- ¿En qué fichero de cabecera se encuentran las funciones matemáticas?
- opciones
- mat.h
- matem.h
- matemat.h
- matematicas.h
- math.h
- mathematics.h
- respuesta
- 5
- ende
- begint
- begine "psc"
- pregunta
- ¿Qué hacen las funciones window() en modo texto y setviewport() en
- modo gráfico?
- respuesta
- Las funciones window() y setviewport() crean una ventana de trabajo
- en la pantalla.
- ende
- begine "psc"
- pregunta
- textcolor (YELLOW);
- textbackgroung (BLUE);
- printf ("abc"); /* ¿Con qué color se escribe "abc" en pantalla? */
- respuesta
- La cadena "abc" se escribe en pantalla en blanco sobre negro. Ahora bien,
- si se hubiera hecho: cprintf ("abc"); entonces la cadena "abc" se hubiera
- escrito en amarillo sobre azul.
- ende
- begine "test"
- pregunta
-
- ¿Qué función es necesaria llamar para poder trabajar en modo gráfico?
- opciones
- cleardevice()
- clearviewport()
- closegraph()
- detectgraph()
- initgraph()
- setgraphmode()
- setviewport()
- respuesta
- 5
- ende
- endt
- begine "prpr"
-
- Realiza un programa que resuelva una ecuación de segundo grado. Para
- ello, deberá leer los coeficientes a, b y c desde teclado y mostrará
- las dos soluciones por pantalla. Se tendrá en cuenta todos los posi-
- bles casos de error, como por ejemplo, división por cero y radicando
- negativo.
- ende
- begine "prpr"
-
- Realiza un programa para justificar un fichero de texto. Los datos
- de entrada serán los nombres de los ficheros de texto fuente y
- destino, así como dos números que representan columna izquierda
- y columna derecha. El fichero fuente ha de copiarse en el fichero
- destino pero con el texto justificado tanto a la izquierda como a
- la derecha.
-
- Por ejemplo, si el fichero de texto fuente contiene el párrafo
- anterior y lo queremos justificar entre las columnas 1 y 20, el
- fichero destino podría ser:
-
- Realiza un programa
- para justificar un
- fichero de texto.
- Los datos de entrada
- serán los nombres de
- los ficheros de
- texto fuente y
- destino, así como
- dos números que
- representan columna
- izquierda y columna
- derecha. El fichero
- fuente ha de
- copiarse en el
- fichero destino pero
- con el texto
- justificado tanto a
- la izquierda como a
- la derecha.
-
- ende
- begint
- begine "prpr"
-
- Con las funciones proporcionadas por Turbo C en la librería de entrada
- y salida por consola, es relativamente fácil diseñar funciones para:
-
- - dibujar ventanas con un determinado marco y colores
- - hacer un menú de opciones, tanto horizontal como vertical
- - realizar una ventana de visualización que visualice un fichero de
- texto
- - editar una línea (un editor de más de una línea es mucho más
- complejo)
-
- Intenta realizar funciones como las que se acaba de mencionar para
- ser utilizadas en futuros programas. De esta forma nos podemos crear
- nuestra propia biblioteca de funciones.
-
- ende
- endt
- end lección 10
-
- ; LECCION 11
- begin
- begine "psc"
- pregunta
- ¿En qué se diferencia el salto realizado por la función longjmp()
- con el salto realizado por la instrucción goto?
- respuesta
- La diferencia está en que el goto realiza saltos locales, es decir,
- saltos dentro de una misma función, y la función longjmp() realiza
- saltos no locales, esto es, saltos de una función a otra.
- ende
- begine "psc"
- pregunta
- ¿Para qué se utiliza las funciones y las macros declaradas en el
- fichero signal.h?
- respuesta
- En el fichero signal.h hay declaradas dos funciones: raise() y signal()
- que se utilizan para enviar y recibir señales respectivamente.
- ende
- begine "psc"
- pregunta
- ¿Cuál es la principal diferencia entre la asignación estática
- y la asignación dinámica de memoria?
- respuesta
- En la asignación estática el tamaño de la memoria a reservar se
- calcula en tiempo de compilación. En la asignación dinámica dicho
- tamaño se calcula en tiempo de ejecución.
- ende
- begine "psc"
- pregunta
- ¿Cuáles son las cuatro funciones de asignación dinámica definidas
- por el ANSI C?
- respuesta
- Las funciones de asignación dinámica definidas por el ANSI C en
- el fichero de cabecera stdlib.h son: calloc(), malloc(), free()
- y realloc().
- ende
- begint
- begine "psc"
- pregunta
- ¿Cuáles son los tres grupos de funciones declaradas en el fichero
- process.h que nos permiten ejecutar otros programas o procesos?
- respuesta
- Los tres grupos de funciones para ejecutar procesos son: las
- funciones exec..., las funciones spawn..., y la función system().
- ende
- begine "psc"
- pregunta
- ¿Cuál es el denominador común de todas las funciones declaradas
- en el fichero de cabecera dir.h?
- respuesta
- Todas las funciones declaradas en el fichero dir.h están relacionadas
- con los directorios.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se utiliza en C la palabra clave interrupt?
- respuesta
- La palabra clave interrupt se utiliza para declarar funciones de
- interrupción. Las funciones de interrupción son llamadas automá-
- ticamente cuando ocurre una determinada interrupción.
- ende
- begine "psc"
- pregunta
- ¿Cuál es la característica común de todas las funciones declaradas
- en el fichero de cabecera dos.h?
- respuesta
- Todas las funciones declaradas en el fichero dos.h están
- estrechamente relacionadas con el sistema operativo DOS.
- ende
- begine "test"
- pregunta
- ¿Son imprescindibles las funciones declaradas en el fichero bios.h
- si se dispone de las funciones de dos.h?
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "prpr"
-
- Realiza un programa que lea el nombre (no ruta) de un programa
- ejecutable, lo busque en la unidad de disco de trabajo, y lo
- ejecute si lo encuentra.
- ende
- begine "prpr"
-
- Realiza un programa que mueva ficheros de un directorio a otro.
- Este programa aceptará dos argumentos, el primero es la especi-
- ficación de los ficheros (puede contener ruta y los caracteres
- comodín * y ?) y el segundo argumento es el nombre del directorio
- al cual se van a mover los ficheros.
-
- Consejo: comprobar si el directorio de destino está en la misma
- unidad que el directorio fuente (en el que están los ficheros a
- mover), y si es así, utilizar la función remove() del C para mover
- los ficheros; si en cambio el directorio de destino está en una
- unidad de disco diferente, entonces habrá que copiar los ficheros
- al directorio de destino y después borrarlos en el directorio origen.
- ende
- begine "prpr"
-
- Diseña un programa residente que visualice continuamente la hora
- actual en la esquina superior derecha de la pantalla.
-
- Consejo: la función que será llamada en cada interrupción de reloj
- tiene que ser declarada como interrupt. El programa se ha de terminar
- llamando a la función keep().
- ende
- endt
- end lección 11
-
- ; LECCION 12
- begin
- begine "psc"
- pregunta
- ¿Qué tipo de funciones se encuentran declaradas en el fichero
- de cabecera stdlib.h?
- respuesta
- En el fichero stdlib.h se encuentran declaradas funciones de naturaleza
- variada. Este fichero es una especie de cajón de sastre donde van a parar
- todas aquellas funciones que no encajan en otros ficheros de cabecera.
- ende
- begine "test"
- pregunta
-
- ¿Qué tipos de funciones hay declaradas en el fichero date.h?
- opciones
- Funciones de hora.
- Funciones de fecha.
- Funciones hora y fecha.
- El fichero de cabecera date.h no existe en el estándar ANSI.
- respuesta
- 4
- ende
- begine "test"
- pregunta
-
- ¿Con qué función podemos saber la fecha actual?
- opciones
- clock()
- ctime()
- gmtime()
- localtime()
- mktime()
- strftime()
- time()
- respuesta
- 7
- ende
- begint
- begine "psc"
- pregunta
- ¿Qué fichero de cabecera es necesario incluir en un programa
- para utilizar la palabra clave asm?
- respuesta
-
- Ninguno, puesto que asm es una palabra clave.
- ende
- endt
- begine "psc"
- pregunta
- Escribe una definición para la macro atoi() usando la función atol(). La
- macro atoi() se encuentra declarada en el fichero de cabecera stdlib.h y
- convierte una cadena en un entero.
- respuesta
-
- #define atoi(s) ((int) atol (s))
- ende
- begint
- begine "psc"
- pregunta
- Escribe una definición para la macro random() usando la función rand(). La
- macro random() está declarada en el fichero stdlib.h de Turbo C y devuelve
- un número aleatorio entre 0 y un número inferior al de su argumento.
- respuesta
-
- #define random(num) (rand () % (num))
- ende
- begine "psc"
- pregunta
- Escribe una definición para la macro randomize() usando las funciones
- srand() y time(). La macro randomize() está declarada en el fichero de ca-
- becera stdlib.h de Turbo C e inicializa el generador de números aleatorios
- respuesta
-
- #define randomize() srand ((unsigned) time (NULL))
- ende
- endt
- begine "prpr"
-
- Implementa las funciones asctime() y strftime() de la librería time.h,
- ya que la funciones que suministra el C escribe los nombres de los días
- y los meses en inglés.
- ende
- begint
- begine "prpr"
-
- Diseña un programa que lea una función matemática y la represente
- gráficamente en el monitor.
-
- ende
- endt
- end lección 12
-